home *** CD-ROM | disk | FTP | other *** search
- * up.s
- * 上スクロール / 最高速 = 5
- * by Mitsuky
-
-
- SPEED_MAX equ 5
-
- .offset 8 * 引き数
- _source_ptr: .ds.l 1
- _dest_ptr: .ds.l 1
- _speed: .ds.l 1
- _vdisp: .ds.l 1
-
-
-
- CRTC_R12 equ $e8_0018 * スクロールX
- CRTC_R14 equ $e8_001c
- CRTC_R16 equ $e8_0020
- CRTC_R18 equ $e8_0024
-
- TRANS32 .macro num * 32 バイト転送マクロ
- movem.l num(a3),d0-d3/a0-a2/a5
- movem.l d0-d3/a0-a2/a5,-(a4)
- .endm
-
-
- .text
- .even
-
- .dc.b 'WL10',$0d,$0a
- .dc.b '上スクロール / 最高速 = 5',$0d,$0a
- .dc.b ' by Mitsuky',$0d,$0a
- .dc.b $1a
- .even
-
- up:
- link a6,#0
- movem.l d1-d7/a0-a5,-(sp)
-
- move.l _speed(a6),d0 * d0.w =
- bmi up_ask_speed
- cmpi.l #SPEED_MAX,d0
- bhi up_err
-
- tst.l _vdisp(a6)
- bmi up_ask_vdisp
-
-
-
- moveq.l #1,d5
- lsl.w d0,d5
- move.l #512,d7
- sub.w d5,d7 * d7.l = スクロール座標
- subq.w #1,d5 * d5.w = V-SYNC 当たりのループ回数-1
-
- move.w #512,d6
- lsr.w d0,d6
- subq.w #1,d6 * d6.w = ループ回数-1
-
- movea.l _source_ptr(a6),a3
- movea.l _dest_ptr(a6),a4
- adda.l #512*512*2-32,a3 * a3.l = 転送元アドレス
- adda.l #512*512*2,a4 * a4.l = 転送先アドレス
-
-
- loop:
- bsr vdisp
-
- move.l d7,CRTC_R12
- move.l d7,CRTC_R14
- move.l d7,CRTC_R16
- move.l d7,CRTC_R18
-
- move.w d5,d4 * d5.w =
- loop_y2:
- TRANS32 0 * HAS ver3.x なら 0(a3) は (a3) に最適化される
- TRANS32 -32*1
- TRANS32 -32*2 * 上スクロールは速度的に一番厳しいので
- TRANS32 -32*3 * ループ展開
- TRANS32 -32*4
- TRANS32 -32*5
- TRANS32 -32*6
- TRANS32 -32*7
- TRANS32 -32*8
- TRANS32 -32*9
- TRANS32 -32*10
- TRANS32 -32*11
- TRANS32 -32*12
- TRANS32 -32*13
- TRANS32 -32*14
- TRANS32 -32*15
- TRANS32 -32*16
- TRANS32 -32*17
- TRANS32 -32*18
- TRANS32 -32*19
- TRANS32 -32*20
- TRANS32 -32*21
- TRANS32 -32*22
- TRANS32 -32*23
- TRANS32 -32*24
- TRANS32 -32*25
- TRANS32 -32*26
- TRANS32 -32*27
- TRANS32 -32*28
- TRANS32 -32*29
- TRANS32 -32*30
- TRANS32 -32*31
-
- subq.w #1,d7
- lea.l -1024(a3),a3
- dbra d4,loop_y2
- dbra d6,loop
-
-
- up_rts:
- moveq.l #0,d0
- up_rts_2:
- movem.l (sp)+,d1-d7/a0-a5
- unlk a6
- rts
-
-
- **** ****
- vdisp:
- movem.l a0,-(sp)
- move.l _vdisp(a6),a0
- jsr (a0)
- movem.l (sp)+,a0
- rts
-
-
- **** ****
- up_err:
- moveq.l #-1,d0
- bra up_rts_2
-
-
- **** ****
- up_ask_speed:
- moveq.l #SPEED_MAX,d0
- bra up_rts_2
-
-
- **** ****
- up_ask_vdisp:
- move.l _speed(a6),d0
- lea.l ask_vdisp_table(pc),a0
- add.w d0,d0
- move.w (a0,d0.w),d0
- bra up_rts_2
-
- ask_vdisp_table:
- .dc.w 512,256,128,64,32,16